//int lengthOfLongestSubstring(string s) {
//    int n = s.size();
//
//    int left = 0, right = 0;
//    int hash[128] = { 0 };
//    int len = 0;
//    while (right < n)
//    {
//        hash[s[right]]++;
//        while (hash[s[right]] > 1)
//        {
//            hash[s[left++]]--;
//        }
//        if (len == 0 || len < right - left + 1) len = right - left + 1;
//        ++right;
//    }
//    return len;
//}

#include <vector>
#include <iostream>
using namespace std;

//int longestOnes(vector<int>& nums, int k) {
//    int n = nums.size();
//    int left = 0, right = 0;
//    int Count_Zero = 0;
//    int len = 0;
//
//    while (right < n)
//    {
//
//        if (right < n && nums[right] == 0)
//        {
//            ++Count_Zero;
//        }
//
//        while (Count_Zero > k)
//        {
//            if (nums[left] == 0) --Count_Zero;
//            ++left;
//        }
//
//        len = max(len, right - left + 1);
//        ++right;
//    }
//    return len;
//}
//
//int main()
//{
//    vector<int> v{ 1,1,1,0,0,0,1,1,1,1,0 };
//    longestOnes(v, 2);
//
//}


//int minOperations(vector<int>& nums, int x) {
//    int sum = 0;
//    for (auto e : nums) sum += e;
//    if (sum < x) return -1;
//    if (sum == x) return 0;
//
//    int n = nums.size(), left = 0, right = 0;
//    int aim = sum - x, total = 0, len = 0;
//    while (right < n)
//    {
//        total += nums[right];
//        while (left < right && total > aim)
//        {
//            total -= nums[left++];
//        }
//        if (total == aim) len = max(len, right - left + 1);
//        ++right;
//    }
//    return n - len;
//}

//int minOperations(vector<int>& nums, int x) {
//    int sum = 0;
//    for (auto e : nums) sum += e;
//    if (sum < x) return -1;
//    if (sum == x) return nums.size();
//
//    int n = nums.size(), left = 0, right = 0;
//    int aim = sum - x, total = 0, len = 0;
//    while (right < n)
//    {
//        total += nums[right];
//        while (left < right && total > aim)
//        {
//            total -= nums[left++];
//        }
//        if (total == aim) len = max(len, right - left + 1);
//        ++right;
//    }
//    if (len == 0) return -1;
//    return n - len;
//}
//
//int main()
//{
//    vector<int> nums{ 5,6,7,8,9 };
//    minOperations(nums, 4);
//}


int Count_Type(int hash[])
{
    int count = 0;
    for (int i = 0; i < 100000; i++)
    {
        if (hash[i] == 0) count++;
    }
    return count;
}

int totalFruit(vector<int>& fruits) {
    int n = fruits.size();
    int right = 0, left = 0;

    int hash[100000] = { 0 }, len = 0;
    //int count = 0;
    while (right < n)
    {
        hash[fruits[right]]++;
        while (Count_Type(hash) < 9998)
        {
            hash[fruits[left++]]--;
        }
        len = max(len, right - left + 1);
        ++right;
    }
    return len;
}

int main()
{
    vector<int> v{ 0,1,2,2 };
    totalFruit(v);
}